/**
 * 校验相关
 */

/**
 * @function   判断文件类型
 * @param      { String }   fileName 文件名称 建议传入文件名
 * @param      { Array }    fileTypeList 支持的文件类型
 * @return     { Boolean }  true：类型通过，false 类型不通过
 * @example    checkFileType('test.png', ['.jpeg'])
 */
export function checkFileType(fileName: string, fileTypeList: string[] = []): boolean {
  let suffix = ''
  let flay = false
  if (!fileName || !Array.isArray(fileTypeList)) {
    return true
  }
  if (fileName.includes('/')) {
    suffix = `.${fileName.substring(fileName.lastIndexOf('/') + 1)}`
  } else if (fileName.indexOf('.') > -1) {
    // 传入的 '1234.png'和 .png 这种 建议直接传文件名进来
    suffix = suffix = fileName.substring(fileName.lastIndexOf('.'))
  } else {
    suffix = `.${fileName}`
  }
  if (fileTypeList.length) {
    fileTypeList.forEach((o) => {
      const resItem = o.indexOf('.') > -1 ? o : `.${o}`
      if (suffix.toLowerCase() === resItem.toLowerCase()) {
        flay = true
      }
    })
    return flay
  }
  return true
}

/**
 * @function   判断文件大小
 * @param      { Number } fileSize 传入需要判断文件的大小,以Byte为单位,建议直接传入file.size
 * @param      { Number } upperLimitSize 传入上限的大小限制 以MB为单位
 * @return     { Boolean } true：大小通过，false 大小不通过
 * @example    checkFileSize(1, 5)
 */
export function checkFileSize(fileSize: number, upperLimitSize: number): boolean {
  if (!fileSize || !upperLimitSize) {
    return true
  }
  return fileSize / 1024 / 1024 <= upperLimitSize
}

/**
 * @function   判断手机号码格式
 * @param      { String| Number } mobileCode 传入需要判断的手机号码
 * @return     { Boolean } true：通过，false 不通过
 * @example    checkMobile('15327701376') ===> true
 */
export function checkMobile(mobileCode: string | number): boolean {
  mobileCode = (mobileCode + '').trim()
  const reg = /^[1][3-9][0-9]{9}$/g
  const numArr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].toString()
  let resPhone = ''
  let isNumber = false
  if (!mobileCode) {
    return false
  }
  // 处理这种奇葩的号码复制黏贴的时候空格bug去不掉  17731460051‬
  for (let i = 0; i < mobileCode.length; i += 1) {
    const str = Number(mobileCode[i])
    for (let j = 0; j < numArr.length; j += 1) {
      const num = numArr[j]
      if (str === Number(num)) {
        resPhone += str
      } else {
        if (isNaN(str)) {
          isNumber = true
        }
      }
    }
  }
  if (isNumber) {
    return false
  }
  return reg.test(resPhone)
}

/**
 * @function   判断邮箱格式
 * @param      { String } emailNumber 传入需要判断的邮箱
 * @return     { Boolean } true：通过，false 不通过
 * @example     checkEmail('286507075@qq.com') ===> true
 */
export function checkEmail(emailNumber: string): boolean {
  const reg = /^([a-zA-Z0-9]+[_|_|\-|.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|_|.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{1,20}$/
  return reg.test(emailNumber.trim())
}

/**
 * @function   判断身份证号码格式
 * @param      { String } idCardCode 传入需要判断的的身份证号码
 * @return     { Boolean } true：通过，false 不通过
 * @example    checkIdCard('422126199920564528') ===> false
 */
export function checkIdCard(idCardCode: string): boolean {
  idCardCode = (idCardCode + '').trim()
  // 身份证号前两位代表区域
  const city: any = {
    11: '北京',
    12: '天津',
    13: '河北',
    14: '山西',
    15: '内蒙古',
    21: '辽宁',
    22: '吉林',
    23: '黑龙江 ',
    31: '上海',
    32: '江苏',
    33: '浙江',
    34: '安徽',
    35: '福建',
    36: '江西',
    37: '山东',
    41: '河南',
    42: '湖北 ',
    43: '湖南',
    44: '广东',
    45: '广西',
    46: '海南',
    50: '重庆',
    51: '四川',
    52: '贵州',
    53: '云南',
    54: '西藏 ',
    61: '陕西',
    62: '甘肃',
    63: '青海',
    64: '宁夏',
    65: '新疆',
    71: '台湾',
    81: '香港',
    82: '澳门',
    91: '国外 ',
  }
  const idCardReg = /^[1-9]\d{5}(19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i // 身份证格式正则表达式
  let isPass = true // 身份证验证是否通过（true通过、false未通过）
  // 如果身份证不满足格式正则表达式
  if (!idCardCode) {
    isPass = false
  } else if (!idCardCode.match(idCardReg)) {
    isPass = false
  } else if (!city[idCardCode.substr(0, 2)]) {
    // 区域数组中不包含需验证的身份证前两位
    isPass = false
  } else if (idCardCode.length === 18) {
    // 18位身份证需要验证最后一位校验位
    const codeList = idCardCode.split('')
    // 加权因子
    const factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    // 校验位
    const parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]
    let sum = 0
    let ai = 0
    let wi = 0
    for (let i = 0; i < 17; i += 1) {
      ai = parseInt(codeList[i])
      wi = factor[i]
      sum += ai * wi // 开始计算并相加
    }
    const last = parity[sum % 11] // 求余
    if (last.toString() !== codeList[17]) {
      isPass = false
    }
  }
  return isPass
}
